import { defineStore } from 'pinia'
import { getUserInfo } from '@/api/user.js'

/**
 * 用户状态管理
 */
export const useUserStore = defineStore('user', {
    // 状态
    state: () => {
        // 安全地解析 localStorage 中的用户信息
        let userInfo = null;
        try {
            const storedUserInfo = uni.getStorageSync('userInfo');
            if (storedUserInfo) {
                userInfo = JSON.parse(storedUserInfo);
            }
        } catch (error) {
            console.error('解析存储的用户信息失败:', error);
            // 清除无效的存储数据
            uni.removeStorageSync('userInfo');
        }

        return {
            token: uni.getStorageSync('Authorization') || '',
            userInfo: userInfo,
            permissions: []
        }
    },

    // getters
    getters: {
        // 是否已登录
        isLoggedIn: (state) => !!state.token,
        // 获取用户ID
        userId: (state) => state.userInfo && state.userInfo.id,
        // 获取用户名
        username: (state) => state.userInfo && state.userInfo.username,
        // 获取用户昵称
        nickname: (state) => state.userInfo && state.userInfo.nickname,
        // 获取用户头像
        avatar: (state) => (state.userInfo && state.userInfo.avatar) || '/static/images/default-avatar.png',
        // 获取用户角色ID
        roleId: (state) => state.userInfo && state.userInfo.roleId,
        // 检查是否有特定权限
        hasPermission: (state) => (permission) => {
            return state.permissions.includes(permission)
        }
    },

    // actions
    actions: {
        // 设置Token
        setToken(token) {
            this.token = token;
            uni.setStorageSync('Authorization', token);
        },

        // 设置用户信息
        setUserInfo(userInfo) {
            this.userInfo = userInfo;
            try {
                uni.setStorageSync('userInfo', JSON.stringify(userInfo));
            } catch (error) {
                console.error('存储用户信息失败:', error);
            }
        },

        // 处理登录成功 - 适应后端返回的数据结构
        loginSuccess(data) {
            // 检查返回的数据结构
            if (!data) {
                console.error('登录成功但没有收到数据');
                return;
            }

            // 从返回的数据中提取 token 和用户信息
            const jwt = data.accessToken || data.accessToken; // 支持两种可能的字段名
            const userInfo = data.user;

            // 设置 token
            if (jwt) {
                this.setToken(jwt);
                // 解析JWT获取权限等信息
                this.parseJWT(jwt);
            } else {
                console.warn('登录成功但没有收到有效的 token');
            }

            // 设置用户信息
            if (userInfo) {
                this.setUserInfo(userInfo);
            } else {
                console.warn('登录成功但没有收到用户信息');
            }
        },

        // 解析JWT获取权限
        parseJWT(token) {
            try {
                // 检查 token 是否为有效字符串
                if (!token || typeof token !== 'string') {
                    console.warn('无效的 token:', token);
                    this.permissions = [];
                    return;
                }

                // 检查 token 格式是否正确（应该包含两个点）
                const parts = token.split('.');
                if (parts.length !== 3) {
                    console.warn('token 格式不正确:', token);
                    this.permissions = [];
                    return;
                }

                const base64Url = parts[1];
                const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');

                try {
                    const jsonPayload = decodeURIComponent(
                        atob(base64)
                        .split('')
                        .map(function(c) {
                            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
                        })
                        .join('')
                    );
                    const payload = JSON.parse(jsonPayload);

                    // 提取权限信息，可能是字符串需要解析
                    if (payload.permissions) {
                        if (typeof payload.permissions === 'string') {
                            try {
                                this.permissions = JSON.parse(payload.permissions).map(p => p.permissionName);
                            } catch (e) {
                                console.error('解析权限字符串失败:', e);
                                this.permissions = [];
                            }
                        } else if (Array.isArray(payload.permissions)) {
                            this.permissions = payload.permissions.map(p =>
                                typeof p === 'string' ? p : (p.permissionName || p.name || '')
                            );
                        } else {
                            this.permissions = [];
                        }
                    } else {
                        this.permissions = [];
                    }
                } catch (decodeError) {
                    console.error('解码 JWT payload 失败:', decodeError);
                    this.permissions = [];
                }
            } catch (error) {
                console.error('解析JWT失败:', error);
                this.permissions = [];
            }
        },

        // 退出登录
        logout() {
            this.token = ''
            this.userInfo = null
            this.permissions = []
            uni.removeStorageSync('Authorization')
            uni.removeStorageSync('userInfo')
        },

        // 检查token是否有效
        checkToken() {
            return !!this.token
        },

        // 清除用户信息缓存，但保留登录状态
        clearUserInfoCache() {
            this.userInfo = null;
            uni.removeStorageSync('userInfo');
        },

        // 获取用户信息（如果没有则从后端获取）
        async fetchUserInfo(forceRefresh = false) {
            // 如果已经有用户信息且不是强制刷新，则直接返回
            if (!forceRefresh && this.userInfo && Object.keys(this.userInfo).length > 0) {
                return this.userInfo
            }

            // 否则从后端获取
            try {
                const res = await getUserInfo()
                if (res.data && (res.data.code === 1 || res.data.code === 200)) {
                    const userData = res.data.data || {}
                    this.setUserInfo(userData)
                    return userData
                } else {
                    console.warn('获取用户信息失败', res)
                    return null
                }
            } catch (error) {
                console.error('获取用户信息失败:', error)
                return null
            }
        }
    }
});